// 其他辅助接口模块
// 包含期权手续费、保证金、龙虎榜等数据

use crate::client::http::build_client;
use crate::types::{Result, OptionCommInfo, OptionMargin, OptionLhb};
use serde_json::Value;

// ============ 期权手续费 ============

/// 期权手续费信息
/// 
/// 获取各交易所期权合约的手续费标准
/// 目标地址: 各交易所官网
/// 
/// # 返回
/// - `Vec<OptionCommInfo>`: 手续费信息列表
/// 
/// # 说明
/// 手续费数据通常来自交易所公告，需要定期更新
pub async fn option_comm_info() -> Result<Vec<OptionCommInfo>> {
    // 这里提供一个示例实现
    // 实际应用中需要从交易所官网或其他数据源获取最新数据
    
    let mut result = Vec::new();
    
    // 上交所期权手续费示例
    result.push(OptionCommInfo {
        exchange: "上交所".to_string(),
        product: "50ETF期权".to_string(),
        contract_code: "510050".to_string(),
        open_fee: Some(1.3),
        close_fee: Some(1.3),
        fee_unit: "元/张".to_string(),
    });
    
    // 中金所期权手续费示例
    result.push(OptionCommInfo {
        exchange: "中金所".to_string(),
        product: "沪深300股指期权".to_string(),
        contract_code: "IO".to_string(),
        open_fee: Some(15.0),
        close_fee: Some(15.0),
        fee_unit: "元/张".to_string(),
    });
    
    // 上期所商品期权手续费示例
    result.push(OptionCommInfo {
        exchange: "上期所".to_string(),
        product: "铜期权".to_string(),
        contract_code: "cu".to_string(),
        open_fee: Some(2.0),
        close_fee: Some(0.0),
        fee_unit: "元/张".to_string(),
    });
    
    // 大商所商品期权手续费示例
    result.push(OptionCommInfo {
        exchange: "大商所".to_string(),
        product: "豆粕期权".to_string(),
        contract_code: "m".to_string(),
        open_fee: Some(1.5),
        close_fee: Some(1.5),
        fee_unit: "元/张".to_string(),
    });
    
    // 郑商所商品期权手续费示例
    result.push(OptionCommInfo {
        exchange: "郑商所".to_string(),
        product: "白糖期权".to_string(),
        contract_code: "SR".to_string(),
        open_fee: Some(1.0),
        close_fee: Some(1.0),
        fee_unit: "元/张".to_string(),
    });
    
    Ok(result)
}

// ============ 期权保证金 ============

/// 期权保证金信息
/// 
/// 获取各交易所期权合约的保证金标准
/// 目标地址: 各交易所官网
/// 
/// # 返回
/// - `Vec<OptionMargin>`: 保证金信息列表
/// 
/// # 说明
/// 保证金数据通常来自交易所公告，需要定期更新
/// 实际保证金 = max(保证金比例 * 合约价值, 最低保证金)
pub async fn option_margin() -> Result<Vec<OptionMargin>> {
    // 这里提供一个示例实现
    // 实际应用中需要从交易所官网或其他数据源获取最新数据
    
    let mut result = Vec::new();
    
    // 上交所期权保证金示例（认购期权）
    result.push(OptionMargin {
        exchange: "上交所".to_string(),
        product: "50ETF期权".to_string(),
        contract_code: "510050C".to_string(),
        margin_rate: Some(12.0), // 12%
        margin_amount: None,
    });
    
    // 上交所期权保证金示例（认沽期权）
    result.push(OptionMargin {
        exchange: "上交所".to_string(),
        product: "50ETF期权".to_string(),
        contract_code: "510050P".to_string(),
        margin_rate: Some(12.0), // 12%
        margin_amount: None,
    });
    
    // 中金所期权保证金示例
    result.push(OptionMargin {
        exchange: "中金所".to_string(),
        product: "沪深300股指期权".to_string(),
        contract_code: "IO".to_string(),
        margin_rate: Some(10.0), // 10%
        margin_amount: None,
    });
    
    // 商品期权保证金示例
    result.push(OptionMargin {
        exchange: "上期所".to_string(),
        product: "铜期权".to_string(),
        contract_code: "cu".to_string(),
        margin_rate: Some(5.0), // 5%
        margin_amount: None,
    });
    
    Ok(result)
}

// ============ 东方财富龙虎榜 ============

/// 东方财富-期权龙虎榜
/// 
/// 获取东方财富网期权龙虎榜单数据
/// 目标地址: https://data.eastmoney.com/other/qqlhb.html
/// 
/// # 参数
/// - `symbol`: 标的代码，例如 "510300"
/// - `indicator`: 指标类型，例如 "期权持仓情况-认沽持仓量"
/// - `trade_date`: 交易日期，格式 "20220121"
/// 
/// # 返回
/// - `Vec<OptionLhb>`: 龙虎榜数据列表
/// 
/// # 指标类型
/// - "期权持仓情况-认购持仓量"
/// - "期权持仓情况-认沽持仓量"
/// - "期权成交情况-认购成交量"
/// - "期权成交情况-认沽成交量"
pub async fn option_lhb_em(
    symbol: &str,
    indicator: &str,
    trade_date: &str,
) -> Result<Vec<OptionLhb>> {
    let url = "https://datacenter-web.eastmoney.com/api/data/v1/get";
    let client = build_client()?;
    
    // 映射指标类型到API参数
    let indicator_code = match indicator {
        "期权持仓情况-认购持仓量" => "CALL_OI",
        "期权持仓情况-认沽持仓量" => "PUT_OI",
        "期权成交情况-认购成交量" => "CALL_VOL",
        "期权成交情况-认沽成交量" => "PUT_VOL",
        _ => "PUT_OI", // 默认
    };
    
    let params = [
        ("reportName", "RPT_OPTION_LHB"),
        ("columns", "ALL"),
        ("filter", &format!("(SECURITY_CODE=\"{}\")(TRADE_DATE='{}')(INDICATOR_CODE=\"{}\")", symbol, trade_date, indicator_code)),
        ("pageNumber", "1"),
        ("pageSize", "500"),
        ("sortColumns", "RANK"),
        ("sortTypes", "1"),
        ("source", "WEB"),
        ("client", "WEB"),
    ];
    
    let resp = client.get(url).query(&params).send().await?;
    let json: Value = resp.json().await?;
    
    let mut result = Vec::new();
    if let Some(data_arr) = json["result"]["data"].as_array() {
        for item in data_arr {
            result.push(OptionLhb {
                trade_type: indicator.to_string(),
                trade_date: item["TRADE_DATE"].as_str().unwrap_or("").to_string(),
                security_code: item["SECURITY_CODE"].as_str().unwrap_or("").to_string(),
                underlying_name: item["SECURITY_NAME_ABBR"].as_str().unwrap_or("").to_string(),
                contract_code: item["CONTRACT_CODE"].as_str().unwrap_or("").to_string(),
                contract_name: item["CONTRACT_NAME"].as_str().unwrap_or("").to_string(),
                open_interest: item["POSITION"].as_f64(),
                change: item["POSITION_CHANGE"].as_f64(),
                net_position: item["NET_POSITION"].as_f64(),
                ratio: item["RATIO"].as_f64(),
            });
        }
    }
    
    Ok(result)
}
